package com.xigua._回溯;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author LiRongHua
 * @Title: ${file_name}
 * @Package ${package_name}
 * @Description: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ，找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ，并以列表形式返回。你可以按 任意顺序 返回这些组合。
 *candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同，则两种组合是不同的。 
 *对于给定的输入，保证和为 target 的不同组合数少于 150 个。
 * @date 2022/2/1016:25
 */
public class _39_组合总和 {

    public static void main(String[] args) {
        List<List<Integer>> lists = combinationSum(new int[]{2, 3, 6, 7}, 7);
        for (List<Integer> list : lists) {
            for (Integer integer : list) {
                System.out.println(integer);
            }
        }
    }

    public static  List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(candidates);
        List<Integer> nums = new ArrayList<>();
        dfs(candidates,target,ans,nums,0,0);
        return ans;
    }

    private static void dfs(int[] candidates, int target, List<List<Integer>> ans,List<Integer> nums,int idx,int sum) {
        if (target == sum ){
            ans.add(new ArrayList(nums));
            return;
        }
        for (int i = idx; i < candidates.length; i++) {
            int res =sum+candidates[i];
            if (res <= target){
                nums.add(candidates[i]);
                dfs(candidates,target,ans,nums,i,res);
                nums.remove(nums.size()-1);
            }else {
                break;
            }
        }

    }


}
